package com.yjr.server.filter;

import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 拦截器，每次请求都会经过此类拦截
 * Filter 过滤器主要是用来过滤用户请求的，它允许我们对用户请求进行前置处理和后置处理，比如实现 URL 级别的权限控制、过滤非法请求等等。
 * Filter 过滤器是面向切面编程——AOP 的具体实现
 * <p>
 * ilter过滤器注解方式优先级问题：
 * filterName ：1、名字长的优先级高 2、名字长度一样的，名字的第一个字母在字母表的顺序，靠前的优先级高，不区分大小写。如A、b、C、DD四个filter的优先级为DD>A>b>C
 * <p>
 * 解决当前服务全局跨域问题
 */
//@Configuration  此注解不需要再添加了，不然会注册两个 CORSFilter ben

@Order(5)//指定过滤器的顺序 值越小越靠前 ，如果未设置的，则按过滤器名称自然排序执行
@WebFilter(filterName = "corsFilter", urlPatterns = {"/*"})    // 第一个参数，过滤器的名称 ； 第二个参数为过滤的路径，/*为所有,此拦截优先
public class CORSFilter implements Filter {

    //初始化过滤器后执行的操作  服务启动执行
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化filter==========================");
    }

    // 对每个请求进行过滤
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token,Authorization,ybg");
        filterChain.doFilter(servletRequest, servletResponse); // 执行被过滤的方法
        System.out.println("每次请求都会经过此filter==========================");
    }

    // 销毁过滤器后执行的操作，主要用户对某些资源的回收 服务停止后执行
    @Override
    public void destroy() {
        System.out.println("销毁filter==========================");
    }
}
